
#ifndef _INCLUDE_MQTT_MQTT_H_
#define _INCLUDE_MQTT_MQTT_H_

#include "Define.h"
#include "Params.h"

#ifdef __cplusplus
extern "C" {
#endif
/**
 * @brief 初始化环境
 */
void UMQTT_InitialGlobalEnv();
/**
 * @brief 创建MQTT 实例
 * @param[in] context       用户上下文
 * @return  MQTT实例
 */
void *UMQTT_CreateEntity(void *context);

/**
 * @brief 设置MQTT消息接收回调
 * @param[in] entity        MQTT 实例
 * @param[in] recvHandler   消息回调
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetRecvHandle(void *entity, RecvHandler recvHandler);

/**
 * @brief 设置MQTT订阅是否支持重发
 * @param[in] entity        MQTT 实例
 * @param[in] reSend        重发标志位
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 * @remark 设置未回复的订阅是否需要重新发送
 */
int32_t UMQTT_SetResendSubscribe(void *entity, uint8_t reSend);

/**
 * @brief 设置日志回调
 * @param[in] cb        日志回调
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetLoggerCb(AiotLoggerCb cb);

/**
 * @brief 设置服务信息
 * @param[in] handle    MQTT 实例
 * @param[in] address   服务地址信息
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetServerInfo(void* entity,AiotServerAddress* address);

/**
 * @brief 设置MQTT事件回调
 * @param[in] entity        MQTT 实例
 * @param[in] eventHandler  事件回调
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetEventHandle(void *entity, AiotEventHandler eventHandler);

/**
 * @brief 设置接入信息
 * @param[in] handle        MQTT 实例
 * @param[in] accessInfo    设备接入信息
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetDeviceInfo(void* entity,AiotDeviceInfo* accessInfo);

/**
 * @brief 设置接入信息
 * @param[in] handle        MQTT 实例
 * @param[in] deviceInfo    产品接入信息
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetProductInfo(void* entity,AiotProductInfo* deviceInfo);

/**
 * @brief 设置通道参数
 * @param[in] handle        MQTT 实例
 * @param[in] channelInfo   通道参数
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetChannelParams(void* entity,AiotChannelParams* channelInfo);

/**
 * @brief 设置销毁超时时间
 * @param[in] handle            MQTT 实例
 * @param[in] destroyTimeout    销毁超时时间,单位ms
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetDestroyTimeout(void* entity,int32_t destroyTimeout);

/**
 * @brief 设置安全通道参数
 * @param[in] handle            MQTT 实例
 * @param[in] credInfo          证书信息
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetChannelCred(void* entity,AiotCredInfo* credInfo);

/**
 * @brief 设置自定义信息
 * @param[in] entity        MQTT 实例
 * @param[in] params        自定义参数
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetCustomInfo(void* entity,MQTTCustomParams* params);

/**
 * @brief 增加topic 以及对应回调
 * @param[in] entity        MQTT 实例
 * @param[in] topic         mqtt topic
 * @param[in] handle        消息处理
 * @param[in] context       用户上下文
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_AddTopicHandle(void *entity, char *topic, RecvHandler handle, void *context);

/**
 * @brief 删除topic 以及对应回调
 * @param[in] entity            MQTT 实例
 * @param[in] topic             mqtt topic
 * @param[in] handle            接收订阅消息回调
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_RemoveTopicHandle(void *entity, char *topic, RecvHandler handle);

/**
 * @brief 设置mqtt 控制信息
 * @param[in] entity         MQTT 实例
 * @param[in] params         控制参数
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_SetControlInfo(void *entity, MQTTControlParams *params);

 /**
  * @brief 销毁MQTT实例
  * @param[in] entity       MQTT 实例
  * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
  */
int32_t UMQTT_DestroyEntity(void **entity);

/**
 * @brief 处理MQTT 数据重传
 * @param[in] entity        MQTT 实例
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_ProcessReTransport(void *entity);

/**
 * @brief 处理MQTT接收数据
 * @param[in] entity        MQTT 实例
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_HandleData(void *entity);

 /**
  * @brief 触发MQTT 连接
  * @param[in] entity       MQTT 实例
  * @param[in] property     MQTT连接属性
  * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
  */
int32_t UMQTT_ConnetServer(void *entity, ConnectProperty *property);

 /**
  * @brief 发布MQTT消息
  * @param[in] entity       MQTT 实例
  * @param[in] params       发布参数
  * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
  */
int32_t UMQTT_Publish(void *entity, PublishParams *params);

/**
 * @brief 与MQTT服务器断开连接
 * @param[in] entity        MQTT 实例
 * @param[in] params        断开连接参数
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_Disconnect(void *entity, DisconnectParams *params);

 /**
  * @brief 订阅topic
  * @param[in] entity       MQTT 实例
  * @param[in] handler      事件发布处理函数
  * @param[in] params       订阅参数
  * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
  */
int32_t UMQTT_Subscribe(void *entity, RecvHandler handler, SubscribeParams *params);

 /**
  * @brief 取消订阅
  * @param[in] entity       MQTT 实例
  * @param[in] params       取消订阅参数
  * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
  */
int32_t UMQTT_UnSubscribe(void *entity, UnSubscribeParams *params);
/**
 * @brief 获取订阅结果
 * @param entity
 * @param params
 * @return
 */
uint8_t UMQTT_SubscribeResult(void *entity, SubscribeParams *params);
/**
 * @brief 断开连接后清除签名信息
 * @param[in] entity       MQTT 实例
 * @return 成功返回aiotSuccess，错误具体代码查看MQTTProtocolError
 */
int32_t UMQTT_ClearSign(void *entity);

/**
 * @brief 去初始化环境
 */
void UMQTT_DeinitialGlobalEnv();

#ifdef __cplusplus
}
#endif

#endif //_INCLUDE_MQTT_H_
